有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

socketjava断开连接

我制作了这个程序,但我遇到了一个问题。当客户端断开连接时,服务器崩溃,我不知道如何解决这个问题

   import java.io.*;
   import java.net.*;
 public class clientread extends Thread{

Socket sc;
public int ver=0;
public clientread(Socket sc)
{
    this.sc=sc;
}
public void run()
{   BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
    while(true){
    try{
    String mes=buf.readLine();
    if(mes.equals("END"))
    {
        sc.close();
        break;
    }

    if(mes!=null)
    {
        PrintStream ps=new PrintStream(sc.getOutputStream());
        ps.println(mes);
    }

    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}
}

}

    import java.net.*;
    import java.io.*;
    public class citireserver extends Thread{
    Socket sock;

    public citireserver(Socket sr)
    {
        sock=sr;
    }
    public void run()
    {
        while(true)
        {
            try{
            BufferedReader buf=new BufferedReader(new InputStreamReader(sock.getInputStream()));
            String mes=buf.readLine();
            if(mes!=null)
                System.out.println(mes);

            }
            catch(Exception e)
            {
                e.printStackTrace();
            }


        }



    }

}

第一个从键盘读取消息并将其传输到服务器,服务器将其传输到其他客户端,第二个读取从服务器传输的所有内容并打印。我想在第一类中设置一个条件,如果客户机输入“END”,它将终止,但a不知道如何结束所有这些。 这是访问这两个类的客户机类

     import java.net.*;
     public class client {

    public static void disc(Socket sc)
    {
        try{
        sc.close();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        try{
        Socket sr=new Socket("192.168.0.105",1028);

            new clientread(sr).start();
            new citireserver(sr).start();

        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

    }

}


import java.net.*;
 public class server {

/**
 * @param args
 */
public static void main(String[] args) {
    System.out.println("the server is running");
    try{
    ServerSocket sr=new ServerSocket(1028,100);
    while(true)
    {
        new handler(sr.accept()).start();
    }
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}

}

 import java.io.*;
 import java.util.*;
 import java.net.*;
 public class handler extends Thread {
public static ArrayList<Socket> sock=new ArrayList<Socket>();
Socket sc;
public handler(Socket sc)
{
    this.sc=sc;
}
public void check()
{
    if(!sc.isConnected())
    {
        for(int i=0;i<sock.size();i++)
        if(sock.get(i)==sc)
            sock.remove(i);
    }
}
public void run()
{
    sock.add(sc);
    System.out.println("connected");
    while(true)
    {
        try{
    BufferedReader io=new BufferedReader(new InputStreamReader(sc.getInputStream()));
    String ms=io.readLine();
    System.out.println(ms);
    if(ms.equals("END"))
        {

        break;
        }
        if(ms!=null)
        {
            Iterator<Socket> it=sock.iterator();
            while(it.hasNext())
            {
                Socket vv=it.next();
                PrintStream ps=new PrintStream (vv.getOutputStream());
                ps.println(ms);
            }
        }
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
    }
    try{

        sc.close(); 
        check();
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}

}

我想把if放在buf之后的头等舱。读线,如果条件为真,则sc.关闭并断开。但它什么也没做,我收到一条消息,可能是因为这个socket在第二个类的另一个线程中使用,我不知道如何停止所有这些。我在我关闭的客户端中遇到了这个错误

java.net.SocketException: Socket is closed at java.net.Socket.getInputStream(Socket.java:876) at citireserver.run(citireserver.java:15)

编辑:在我解决了这个问题后,我得到了另一个

error:java.net.SocketException: Socket is closed at java.net.Socket.getOutputStream(Socket.java:916) at handler.run(handler.java:41)

这个错误出现在我断开一个客户机的连接之后,我认为这是因为该socket没有从arraylist中删除,当它迭代时,它会在该socket上运行。为什么它不移除它?check()有什么问题


共 (1) 个答案

  1. # 1 楼答案

    readLine()返回null时,您应该:

    • 停止阅读
    • 退出循环
    • 合上插座